package com.navinfo.tripanalysis.common.arithmetic.convert;

import com.navinfo.tripanalysis.common.arithmetic.common.CommonData;
import com.navinfo.tripanalysis.common.arithmetic.common.DrivingData;
import com.navinfo.tripanalysis.common.arithmetic.common.OuterEventData;

import java.util.Optional;

/**
 * 中间对象转换事件对象帮助类.
 * @author 水哥
 */
public class EventDataConvert {
    /**
     * 创建事件并且从当前中间对象赋值到开始事件对象.
     * @param drivingData 当前中间对象
     * @return OuterEventData
     */
    public static OuterEventData newInstanceAndConvertStart(DrivingData drivingData) {
        return convertStart(new OuterEventData(), drivingData);
    }

    /**
     * 从公共变量赋值到开始事件对象.<br/>
     *  设置开始的时间、经度、维度、高度、速度、方向
     * @param eventData   事件对象（开始时）
     * @param drivingData 当前中间对象
     */
    public static OuterEventData convertStart(OuterEventData eventData, DrivingData drivingData) {
        CommonData commonData = drivingData.getCommonData();
        eventData.setStartGpsTime(commonData.getGpsTime());
        eventData.setStartLatitude(commonData.getLatitude());
        eventData.setStartLongitude(commonData.getLongitude());
        eventData.setStartHeight(commonData.getHeight());
        eventData.setStartSpeed(commonData.getSpeedKmh());
        eventData.setStartGpsDirection(commonData.getGpsDirection());
        return eventData;
    }

    /**
     * 从公共变量赋值到结束事件对象.<br/>
     * 设置结束的时间、经度、维度、高度、速度、方向<br/>
     * 事件的持续时长
     * @param eventData   事件对象（结束时）
     * @param drivingData 当前中间对象
     */
    public static OuterEventData convertEnd(OuterEventData eventData, DrivingData drivingData) {
        CommonData commonData = drivingData.getCommonData();
        eventData.setStopGpsTime(commonData.getGpsTime());
        eventData.setStopHeight(commonData.getHeight());
        eventData.setStopSpeed(commonData.getSpeedKmh());
        eventData.setStopLatitude(commonData.getLatitude());
        eventData.setStopLongitude(commonData.getLongitude());
        eventData.setStopGpsDirection(commonData.getGpsDirection());
        eventData.setDuration(eventData.getStopGpsTime() - eventData.getStartGpsTime());
        return eventData;
    }

    /**
     * 大部分算法ExtendField05是累计里程，ExtendField06是累计油耗.
     * @param eventData 事件对象
     */
    public static OuterEventData convertCommonExtendField(OuterEventData eventData, DrivingData drivingData) {
        // 里程
        eventData.setExtendField05( Optional.ofNullable(eventData.getExtendField05()).orElse(0.0)+ drivingData.getCommonData().getDffMileage());
        // 油耗
        eventData.setExtendField06( Optional.ofNullable(eventData.getExtendField06()).orElse(0.0) + drivingData.getCommonData().getDffFuel());
        return eventData;
    }
}
